package com.nas.crocus.service.impl;

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.nas.crocus.dao.RutaDao;
import com.nas.crocus.domain.Evento;
import com.nas.crocus.domain.Ruta;
import com.nas.crocus.domain.Vuelo;
import com.nas.crocus.service.RutaService;

@Service
@Transactional
public class RutaServiceImpl implements RutaService {

    @Autowired
    private RutaDao rutaDao;
    
    @Override
    public void actualizar(Ruta ruta) {
       Ruta rutaExistente = rutaDao.buscar(ruta.getId());
       rutaExistente.setCantidadAereo(ruta.getCantidadAereo());
       rutaExistente.setVencimiento1(ruta.getVencimiento1());
       rutaExistente.setVencimiento2(ruta.getVencimiento2());
       rutaExistente.setVencimiento3(ruta.getVencimiento3());       
       mergeVuelos(ruta, rutaExistente);
       rutaDao.actualizar(rutaExistente);
    }

    @Override
    public void crear(Ruta ruta) {
        rutaDao.guardar(ruta);
    }

    @Override
    public void eliminar(Ruta ruta) {
        rutaDao.eliminar(ruta);
    }

    
    private void mergeVuelos(Ruta ruta,
            Ruta rutaExistente) {
        Collection<Vuelo> vuelosExistentes = rutaExistente.getVuelos();
        ArrayList<Vuelo> vuelosCreados = new ArrayList<Vuelo>();
        ArrayList<Vuelo> vuelosModificados = new ArrayList<Vuelo>();
        ArrayList<Vuelo> vuelosEliminados = new ArrayList<Vuelo>();
        
        boolean eliminarVuelo;
        
        for (Vuelo vuelo : ruta.getVuelos()) {
            if (vuelo.getId() == null) {
                vuelo.setRuta(rutaExistente);
                vuelosCreados.add(vuelo);        
            } else {
                vuelosModificados.add(vuelo);
            }
        }
        for (Vuelo vueloExistente : vuelosExistentes) {
            eliminarVuelo = true;
            for (Vuelo vuelo : vuelosModificados) {
                if (vuelo.getId().longValue() == vueloExistente.getId().longValue()) {
                    vueloExistente.setFecha(vuelo.getFecha());
                    vueloExistente.setOrigenDestino(vuelo.getOrigenDestino());
                    vueloExistente.setHoraLlegada(vuelo.getHoraLlegada());
                    vueloExistente.setHoraSalida(vuelo.getHoraSalida());
                    eliminarVuelo = false;
                    break;
                }                
            }
            if (eliminarVuelo) {
                vuelosEliminados.add(vueloExistente);                
            }
        }
        for (Vuelo vueloAEliminar : vuelosEliminados) {
            vuelosExistentes.remove(vueloAEliminar);
        }
        
        vuelosExistentes.addAll(vuelosCreados);
    }
}
